﻿// Dollar Dayz POJ - 3181.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>
using namespace std;

//https://vjudge.csgrandeur.cn/problem/POJ-3181


/*
内容简介
农场主约翰去参加奶牛商店的 "一元日 "活动，发现有无数的工具在出售。
约翰农场主正好有 5 美元可花。他可以以每件 1 美元的价格买 5 件工具，
或者以 3 美元的价格买 1 件工具，再以 2 美元的价格买 1 件工具。
当然，还有其他组合，农场主约翰总共可以用 5 种不同的方式把钱花在工具上。它们是

        1 件 3 美元 + 1 件 2 美元

        1 @ 3 美元 + 2 @ 1 美元

        1 @ 2 美元 + 3 @ 1 美元

        2 @ 2 美元 + 1 @ 1 美元

        5 @ 1 美元
写一个程序，计算 FJ 在奶牛商店购买成本为 1...K 美元（1 <= K <= 100）的工具时，
可以花 N 美元（1 <= N <= 1000）的方式有多少种。
输入
一行，包含两个空格分隔的整数： N 和 K。
输出
一行，包含一个整数，即 FJ 可以花掉他的钱的唯一方式的数量。
输入示例
5 3
样本输出
5
*/

const int N = 1010;
long long dp[105][N][2];
int n, k;

const long long INF = 1e16;

int main()
{
   
   cin >> n >> k;

    memset(dp,0, sizeof dp);
    dp[0][0][0] = 1;
    for (int i = 1; i <= k; i++) {
        for (int j = 0; j <= n; j++) {
            //dp[i][j] += dp[i - 1][j];
            dp[i][j][1] = dp[i][j][1] + dp[i - 1][j][1] + (dp[i][j][0] + dp[i - 1][j][0]) / INF;
            dp[i][j][0] = (dp[i][j][0] + dp[i - 1][j][0]) % INF;
            if (j >= i) {
                //dp[i][j] += dp[i][j - i];
                dp[i][j][1] = dp[i][j][1] + dp[i][j-i][1] + (dp[i][j][0] + dp[i][j-i][0]) / INF;
                dp[i][j][0] = (dp[i][j][0] + dp[i][j-i][0]) % INF;
            }
        }
    }
    
    //cout << dp[k][n] << endl;
    if (dp[k][n][1] != 0) {
        cout << dp[k][n][1];
    }
    cout << dp[k][n][0] << endl;
    

    return 0;
}

 